package commande;

import java.io.IOException;
import java.util.Properties;

import utils.StringUtils;

import librairies.liste.interfaces.IListeE;
import IO.properties.PropertiesLoader;

import commande.interfaces.IConsole;
import commande.os.android.ConsoleAndroid;
import commande.os.linux.ConsoleLinux;
import commande.os.windows.ConsoleWindows;
import commande.outils.Processus;

/**
 * permet d'effectuer des actions sur la console
 * 
 * @author mlozach
 */
public class Console
{
	private static Console instance;
	
	private String name;	
	private IConsole console;
	private Outils outils;
	private Lien lien;
		
	/**
	 * pour le singleton
	 */
	public static Console getInstance() 
	{
		if (instance == null) instance = new Console();
		return instance;
	}

	private Console() 
	{
		this.name = System.getProperty ("os.name");
		
		if(this.name.contains("Linux"))
		{
			this.console = new ConsoleLinux();
		}
		else if(this.name.contains("Windows"))
		{
			this.console = new ConsoleWindows();
		}
		else if(this.name.contains("Android"))
		{
			this.console = new ConsoleAndroid();
		}
		
		this.outils = Outils.getInstance();
		this.lien = Lien.getInstance();
	}
	
	
	/**
	 * permet de retrouver un fichier
	 * @param racine ou rechercher
	 * @param fichier le fichier a chercher
	 * @return la liste des fichier trouver
	 */
	public IListeE<String> rechercheFichier(String racine, String fichier)
	{
		if(StringUtils.isEmpty(racine) || StringUtils.isEmpty(fichier)) return null;
		
		if(this.console != null)
		{
			return this.console.rechercheFichier(racine, fichier);
		}
		else 
		{
			return null;
		}
	}
	
	public Processus executionApp(String nom, String argument)
	{
		if(this.console != null)
		{
			Processus pro;
			try 
			{
				pro = this.console.execution(nom, argument);
				this.outils.add(pro);
				return pro;	
			} catch (IOException e) 
			{
				this.outils.out("programme non trouvé");
				return null;
			}		
		}
		else 
		{
			return null;
		}
	}
	
	public Processus executionFichier(String nom, String argument)
	{
		if(this.console != null && nom != null)
		{
			try
			{
				Processus pro = null;
				
				StringBuilder fichier = new StringBuilder();
				fichier.append(nom);
				if(argument != null && argument.length() != 0)
				{
					fichier.append(" ");
					fichier.append(argument);
				}
				
				
				int posExt = nom.lastIndexOf(".");
				if(posExt == -1)
				{	
						pro = this.console.execution("gedit", fichier.toString());
				}
				else
				{
					String ext = nom.substring(posExt + 1);
					
					Properties proExt = PropertiesLoader.load(lien.getDossierProperties() + "extension.properties");
					
					String type = proExt.getProperty(ext.toLowerCase());
					if(type == null) 
					{
						pro = this.console.execution("gedit", fichier.toString());
					}
					else
					{
						pro = this.console.execution(type, fichier.toString());
					}
				}
				this.outils.add(pro);
				return pro;
				
			} catch (IOException e) 
			{
				this.outils.out("programme non trouvé");
				return null;
			}
		}
		else 
		{
			return null;
		}
	}
	
	public Processus executionShell(String nom, String argument)
	{
		if(nom == null) return null;
		
		String preludeExec = null;
		
		if(nom.contains(lien.getSlash()))
		{
			preludeExec = nom;
		}
		else
		{
			preludeExec = "./" + nom;
		}

		if(this.console != null)
		{
			Processus pro;
			try 
			{
				pro = this.console.execution(preludeExec, argument);
				
				this.outils.add(pro);
				return pro;
			} catch (IOException e) 
			{
				this.outils.out("programme non trouvé");
				return null;
			}
		}
		else 
		{
			return null;
		}
	}
}